package com.example.navigation_bar;

import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentTransaction;

import com.example.navigation_bar.Home.HomeFragment;
import com.example.navigation_bar.Mine.MineFragment;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

import org.jetbrains.annotations.Contract;

public class MainActivity extends AppCompatActivity {
    //控件对象
    private BottomNavigationView bottomNavigationView;
    //视图代码块
    private HomeFragment homeFragment;
    //视图代码块
    private MineFragment mineFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //获取底部导航栏控件ID
        bottomNavigationView = findViewById(R.id.BottomNavigationView);
        //默认选中首页-0
        selectenFragment(0);
        //重写 设置选项选择监听器
        bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                //判断点击的对象ID然后切换到相关页面
                if (menuItem.getItemId() == R.id.home){
                    selectenFragment(0);
                } else if (menuItem.getItemId() == R.id.mine) {
                    selectenFragment(1);
                }
                return true;
            }
        });
    }

    /**
     * 根据相关数字切换界面
     * @param position 0=home 1=mine
     */
    private void selectenFragment(int position) {
        //创建FragmentTransaction管理器对象
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        //自写的函数
        hideFragment(fragmentTransaction);
        //根据position变量判断相关对象视图  然后判断对象视图是否创建 没有就创建  有就显示
        if(position == 0){
            if(homeFragment == null){
                homeFragment = new HomeFragment();
                /**
                 * 将片段添加到活动状态。此片段还可以选择性地将其视图（如果fragment.onCreateView返回非null）放入活动的容器视图中。
                 * containerViewId  要放置此片段的容器的可选标识符。如果为0，则不会将其放置在容器中。
                 * fragment  要添加的片段。此片段不得已添加到活动中。
                 * tag  片段的可选标签名称，用于稍后使用FragmentManager.findFragmentByTag（String）检索片段。
                 * return 返回相同的FragmentTransaction实例。
                 */
                fragmentTransaction.add(R.id.FLayout,homeFragment);
            }else{
                //显示相关对象视图
                fragmentTransaction.show(homeFragment);
            }
        } else if (position == 1){
            if(mineFragment == null){
                mineFragment = new MineFragment();
                fragmentTransaction.add(R.id.FLayout,mineFragment);
            }else{
                fragmentTransaction.show(mineFragment);
            }
        }
        /**
         * 安排此事务的提交。提交不会立即发生；它将被安排为主线程上的工作，以便在该线程下一次准备好时完成。
         * 事务只能在包含活动保存其状态之前使用此方法提交。如果在该点之后尝试提交，则会引发异常。这是因为如果活动需要从其状态恢复，
         * 则提交后的状态可能会丢失。请参阅commitAllowingStateLoss（），了解可以丢失提交的情况。
         * return
         * 如果调用了addToBackStack（String），则返回此事务的后堆栈项的标识符。否则，返回一个负数。
         */
        fragmentTransaction.commit();
    }

    /**
     * 因为窗口对象视图后对象就不等于null 为了防止重复创建就隐藏相关对象
     * @param fragmentTransaction 对象视图
     */
    @Contract(pure = true)
    private  void hideFragment(FragmentTransaction fragmentTransaction){
        if(homeFragment != null){
            fragmentTransaction.hide(homeFragment);
        }
        if(mineFragment != null){
            fragmentTransaction.hide(mineFragment);
        }
    }
}